package com.shisan.tingshu.common.util;

import lombok.Getter;

/**
 * 动态生成 MongoDB 分片表名的工具类
 */
public class MongoUtil {

    @Getter
    public enum MongoCollectionEnum {

        // 第一个参数：表示这些集合会被分成100个分片（表）
        // 第二个参数：表示这些集合的前缀
        USER_SUBSCRIBE(100,"userSubscribe"),
        USER_COLLECT(100,"userCollect"),
        USER_LISTEN_PROCESS(100,"userListenProcess"),
        COMMENT(100,"comment"),
        COMMENT_PRAISE(100,"commentPraise"),
        ;

        private Integer partition;
        private String collectionPrefix;

        MongoCollectionEnum(Integer partition, String collectionPrefix) {
            this.partition = partition;
            this.collectionPrefix = collectionPrefix;
        }
    }

    /**
     * 获取 MongoDB 表名
     * @param mongoCollection 选择要操作的集合
     * @param route 路由键，通常是 userId 或 trackId，用于计算分片位置
     * @return
     */
    public static String getCollectionName(MongoCollectionEnum mongoCollection, Long route) {
        /**
         * 1、route % mongoCollection.getPartition()
         * 用 route（如 userId）对 partition（这里是100）取模，得到分片编号 [0, 99]。
         * 例如：
         * userId = 123 → 123 % 100 = 23 → 分片 23
         * userId = 200 → 200 % 100 = 0 → 分片 0
         * 2、拼接表名
         * 格式：collectionPrefix + "_" + 分片编号
         * 例如：
         * userId = 123 → "userListenProcess" + "_" + 23 → userListenProcess_23
         * userId = 200 → "userListenProcess" + "_" + 0 → userListenProcess_0
         */
        return mongoCollection.getCollectionPrefix() + "_" + route % mongoCollection.getPartition();
    }
}